// 导入React Hooks
import { useEffect, useRef } from "react";
// 导入@react-three/fiber的useFrame Hook以便于在每一帧中更新场景
import { useFrame } from "@react-three/fiber";
// 导入@react-three/drei的useGLTF和useAnimations Hook用于加载3D模型及其动画
import { useGLTF, useAnimations } from "@react-three/drei";

// 导入本地存储的3D鸟模型资源文件
import birdScene from "../assets/3d/bird.glb";

// 模型来源：https://sketchfab.com/3d-models/phoenix-bird-844ba0cf144a413ea92c779f18912042
export function Bird() {
  // 创建一个React ref来保存Three.js中的mesh实例
  const birdRef = useRef();

  // 使用useGLTF Hook加载3D鸟模型及相关的动画数据
  const { scene, animations } = useGLTF(birdScene);

  // 使用useAnimations Hook获取动画控制器集合
  const { actions } = useAnimations(animations, birdRef);

  // 组件挂载后自动播放名为“Take 001”的动画
  useEffect(() => {
    if (actions["Take 001"]) {
      actions["Take 001"].play();
    }
  }, []);

  // 在每一帧中更新鸟的位置和方向
  useFrame(({ clock, camera }) => {
    // 让鸟在Y轴方向模拟飞行的上下摆动
    birdRef.current.position.y = Math.sin(clock.elapsedTime) * 0.2 + 2;

    // 根据鸟相对于相机的位置改变飞行方向和旋转角度
    if (birdRef.current.position.x > camera.position.x + 10) {
      // 鸟飞过相机右侧边界，反转方向并旋转180度
      birdRef.current.rotation.y = Math.PI;
    } else if (birdRef.current.position.x < camera.position.x - 10) {
      // 鸟飞过相机左侧边界，恢复初始方向并重置旋转角度
      birdRef.current.rotation.y = 0;
    }

    // 根据鸟的方向更新X和Z坐标位置
    if (birdRef.current.rotation.y === 0) {
      // 向前飞行
      birdRef.current.position.x += 0.01;
      birdRef.current.position.z -= 0.01;
    } else {
      // 向后飞行
      birdRef.current.position.x -= 0.01;
      birdRef.current.position.z += 0.01;
    }
  });

  // 返回一个包含3D网格组件<mesh>，其中引用了加载的鸟模型场景
  return (
    <mesh ref={birdRef} position={[-5, 2, 1]} scale={[0.003, 0.003, 0.003]}>
      {/* 直接嵌入复杂的3D模型或场景时使用<primitive>元素 */}
      <primitive object={scene} />
    </mesh>
  );
}